package com.itheima.d5_collection_exception;
import java.util.*;

/**
 * 目标：理解集合的并发修改异常问题，并解决。
 *
 * 使用迭代器遍历集合时，又同时在删除集合中的数据，程序就会出现并发修改异常的错误。
 * 由于增强for循环遍历集合就是迭代器遍历集合的简化写法，因此，使用增强for循环遍历集合，又在同时删除集合中的数据时，程序也会出现并发修改异常的错误
 *
 * 怎么保证遍历集合同时删除数据时不出bug？
 * 使用迭代器遍历集合，但用迭代器自己的删除方法删除数据即可。
 * 如果能用for循环遍历时：可以倒着遍历并删除；或者从前往后遍历，但删除元素后做i --操作。
 *
 */
public class CollectionTest1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("王麻子");
        list.add("小李子");
        list.add("李爱花");
        list.add("张全蛋");
        list.add("晓李");
        list.add("李玉刚");
        System.out.println(list);
        //  [王麻子, 小李子, 李爱花, 张全蛋, 晓李, 李玉刚]

        // 需求：找出集合中全部带“李”的名字，并从集合中删除。
        //报错：ConcurrentModificationException，删除不干净，迭代器内部会报异常
/*        Iterator<String> it = list.iterator();
        while (it.hasNext()){
            String name = it.next();
            if(name.contains("李")){
                list.remove(name);
            }
        }
        System.out.println(list);*/

        // 使用for循环遍历集合并删除集合中带李字的名字
        //初始：  [王麻子, 小李子, 李爱花, 张全蛋, 晓李, 李玉刚]
        //遍历：  [王麻子, 李爱花, 张全蛋, 李玉刚]
        //                                i
        //迭代器遍历报异常的原因：for循环每次删除一个匹配的元素后，数组元素都会前移，所以删除不干净，但是for循环不会报错
        /*for (int i = 0; i < list.size(); i++) {
            String name = list.get(i);
            if(name.contains("李")){
                list.remove(name);
            }
        }
        System.out.println(list);*/

        System.out.println("---------------------------------------------------------");

        // 怎么解决呢？
        // 使用for循环遍历集合并删除集合中带李字的名字
        //  [王麻子, 小李子, 李爱花, 张全蛋, 晓李, 李玉刚]
        //  [王麻子, 张全蛋]
        //                  i
//        for (int i = 0; i < list.size(); i++) {
//            String name = list.get(i);
//            if(name.contains("李")){
//                list.remove(name);
//                i--;
//            }
//        }
//        System.out.println(list);
        // 倒着去删除也是可以的。

        // 需求：找出集合中全部带“李”的名字，并从集合中删除。
   /*     Iterator<String> it = list.iterator();
        while (it.hasNext()){
            String name = it.next();
            if(name.contains("李")){
                // list.remove(name); //不能用集合对象直接去删除元素，不然会报：并发修改异常的错误。
                it.remove(); // 删除迭代器当前遍历到的数据，每删除一个数据后，相当于也在底层做了i--
            }
        }
        System.out.println(list);*/

        // 使用增强for循环遍历集合并删除数据，也会报并发修改异常：ConcurrentModificationException，并且没有办法解决bug.
        //因为增强for循环其实就是迭代器遍历的简化写法
  /*      for (String name : list) {
            if(name.contains("李")){
                list.remove(name);
            }
        }
        System.out.println(list);*/


        //lambda表达式也会报并发修改异常，因为底层也是用了增强for循环
/*        list.forEach(name -> {
            if(name.contains("李")){
                list.remove(name);
            }
        });
        System.out.println(list);*/
    }
}
